from random import randint
import module1 as m1
import module2 as m2

def fac(num):
    result = 1
    for i in range(num, 1, -1):
        result *= i
    return result


print(fac(5))


##在Python中，函数的参数可以有默认值，也支持使用可变参数，所以Python并不需要像其他语言一样支持函数的重载，因为我们在定义一个函数的时候可以让它有多种不同的使用方式
def roll_dice(n=2):
    ##摇骰子
    total = 0
    for _ in range(n):
        total += randint(1,6)
    return total

def add(a=0, b=0, c=0):
    return a + b + c

def add1(*args):
    total = 0
    for i in args:
        total += i
    return total

##默然摇2个骰子
print(roll_dice())
##摇3颗
print(roll_dice(3))

##不需要重载，
print(roll_dice(add()))
print(roll_dice(add(1)))
print(roll_dice(add(1,2)))
print(roll_dice(add(1,2,3)))
## 也可以直接使用可变参数
print(roll_dice(add1(1,2,3,4,5)))


##最简单的场景就是在同一个.py文件中定义了两个同名函数，由于Python没有函数重载的概念，那么后面的定义会覆盖之前的定义，也就意味着两个函数同名函数实际上只有一个是存在的。
def test():
    print("test1")

def test():
    print("test2")


if __name__ == '__main__':
    test()
    ##上面的这种情况我们很容易就能避免，但是如果项目是由多人协作进行团队开发的时候，团队中可能有多个程序员都定义了名为foo的函数，那么怎么解决这种命名冲突呢？答案其实很简单，
    # Python中每个文件就代表了一个模块（module），我们在不同的模块中可以有同名的函数，在使用函数的时候我们通过import关键字导入指定的模块就可以区分到底要使用的是哪个模块中的foo函数

    ##from module1 import foo
    ##from module2 import foo
    ##输出goodbye, world!
    ##foo()
    m1.foo()
    m2.foo()
